from django import forms
from django_redis import get_redis_connection
# 创建手机号正则校验器，导入正则校验器
from django.core.validators import RegexValidator
from user.models import User
# 校验手机号格式
mobile_validator=RegexValidator(r'^1[3-9]\d{9}$','手机号匹配不正确')
# forms校验
class CheckInmage(forms.Form):
    def __init__(self,*args,**kwargs):
        self.request=kwargs.pop('request')
        print(kwargs)
        super().__init__(*args,**kwargs)
    #检测手机号字段
    telephone=forms.CharField(max_length=11,min_length=11,validators=[mobile_validator],
                           error_messages={
                                'max_length':'手机号长度有误',
                                'min_length':'手机号长度有误',
                                'required':'手机号不能为空',
                            })
    #检测图片验证码字段
    sms_captcha=forms.CharField(max_length=4,min_length=4,
                            error_messages={
                                'max_length':'验证码长度有误',
                                'min_length':'验证码长度有误',
                                'required':'验证码不能为空',
                            })
    def clean(self):
        #如果不继承clean()方法，使用cleaned_data()方法筛选，需要返回cleand_data
        clean_data=super().clean()
        #清洗数据
        telephone=clean_data.get('telephone')
        sms_captcha=clean_data.get('sms_captcha')
        #校验图片验证码
        image_code=self.request.session.get('image_code')
        if (not image_code) or (image_code.upper() !=sms_captcha.upper()):
            raise forms.ValidationError('图片验证码错误')
        #检测短信验证码是否发送，发送则不能继续发送
        redis_conn=get_redis_connection(alias='default')
        if redis_conn.get('sms_flag_{}'.format(telephone)):
            raise forms.ValidationError('获取短信验证码过于频繁')
        #检测手机号是否注册过
        if User.objects.filter(mobile=telephone).count():
            raise forms.ValidationError('手机号已经注册')

